<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    'use strict'
    // 问题1：set 和 deleteProperty 中需要返回布尔类型的值
    // 在严格模式下，如果返回 false 的话会出现 Type Error 的异常
    // const target = {
    //   foo: 'xxx',
    //   bar: 'yyy'
    // }
    // // Reflect.getPrototypeOf()
    // // Object.getPrototypeOf()
    // const proxy = new Proxy(target, {
    //   get (target, key, receiver) {
    //     // return target[key]
    //     return Reflect.get(target, key, receiver)
    //   },
    //   set (target, key, value, receiver) {
    //     // target[key] = value
    //     return Reflect.set(target, key, value, receiver)
    //   },
    //   deleteProperty (target, key) {
    //     // delete target[key]
    //     return Reflect.deleteProperty(target, key)
    //   }
    // })
    // proxy.foo = 'zzz'
    // console.log(proxy.foo)
    // delete proxy.foo
    // console.log(proxy.foo)

    // 问题2： Proxy 和 Reflect 中使用的 receiver

    // Proxy 中 receiver: Proxy 或者继承 Proxy 的对象
    // Reflect 中 receiver：如果 target 对象中设置了 getter，getter 中的 this 指向 receiver
    
    const obj = {
      get foo() {
        console.log(this)
        return this.bar
      }
    }

    const proxy = new Proxy(obj, {
      get (target, key, receiver) {
        if (key === 'bar') {
          return 'value-bar'
        }
        return Reflect.get(target, key, receiver)
      }
    })
    console.log(proxy.foo)
  </script>
</body>